<?php

namespace App\Http\Middleware;

use App\Http\Model\Hint;
use Closure;
use Throwable;

/**
 * API响应AES加密中间件
 */
class AesEncryV2
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $original = $response->getOriginalContent();
        
        // 标准化响应格式
        $result = [
                'code' => $original['code'] ?? Hint::SUCCESS,
                'data' => $this->getResponseData($original),
                'msg' => $original['msg'] ?? ''
        ];
        
        return preEnAES($result['code'], $result['data'], $result['msg']);
    }

    /**
     * 从原始响应提取数据并过滤掉元字段
     * 
     * @param mixed $original 原始响应数据
     * @return array|mixed 处理后的数据，总是返回数组或标量
     */
    protected function getResponseData($original)
    {
        // 确定要处理的数据源
        $data = is_array($original) && isset($original['data']) 
            ? $original['data'] 
            : $original;
        
        // 确保返回可用的数据类型
        if (!is_array($data) && !is_scalar($data)) {
            return [];
        }
        
        // 如果是数组，过滤掉元字段
        if (is_array($data)) {
            $data = array_diff_key($data, array_flip(['code', 'msg'])); // 可扩展其他元字段
        }
        
        return $data;
    }
}